---
id: unit6
title: 第六章 存储管理
---

## 存储管理概述

**内存空间:**  
是由存储单元（字节或字）组成的一维连续的地址空间，简称内存空间。
内存空间一般分为两部分：一部分是系统区，用以存储操作系统常驻内存部分，用户不能占用这部分空间；
另一部分是用户区，分配给用户使用，用于装入并存储用户程序和数据，这部分的信息随时都在发生变化。存储管理实质上就是管理供用户使用的那部分空间。

**内存分配有两种方式：**  
（1）静态分配：程序要求的内存空间是在目标模块连接装入内存时确定并分配的，并且在程序运行过程中不允许再申请或在内存中“搬家”，即分配工作是在程序运行前一次性完成。  
（2）边态分配：程序要求的基本内存空间是在目标模块装入时确定并分配的，但是在程序运行过程中允许申请附加的内存空间或在内存中“搬家”，即分配工作可以在程序运行前及运行过程中逐步完成。

**存储共享：**
是指两个或多个进程共用内存中相同区域，这样不仅能使多道程序动态地共享内存，提高内存利用率，而且还能共享内存中某个区域的信息。共享的内容包括代码共享和数据共享，特别是代码共享要求代码必须是纯代码。
存储共享的一个目的是通过代码共享节省内存空间，提高内存利用率；
另一个目的是通过数据共享实现进程通信。

**存储保护的内容包括：**  
保护系统程序区不被用户有意或无意的侵犯；不允许用户程序读写不属于自己地址空间的数据，如系统区地址空间、其他用户程序的地址空间。

**地址重定位：**  
把逻辑地址转换成绝对地址的工作称“地址重定位”或“地址转换”，又称“地址映射”。重定位的方式可以有“静态重定位”和“动态重定位”。  
静态重定位：内存在装入程序时，要把程序中的指令地址和数据地址全部转换成绝对地址。由于地址转换工作是在程序开始执行前集中完成的，所以在程序执行过程中就无须再进行地址转换工作，这种地址转换方式称“静态重定位”。  
动态重定位：内存在装入程序时，不进行地址转换，而是直接把程序装入到分配的内存区域中。在程序执行过程中，每当执行一条指令时都由硬件的地址转换机构将指令中的逻辑地址转换成绝对地址。这种方式的地址转换是在程序执行时动态完成的，故称为“动态重定位”。  

## 分区管理方案
**固定分区**是指系统先把内存划分成若干个大小固定的分区，一旦划分好，在系统运行期间便不再重新划分。为了满足不同程序的存储要求，各分区的大小可以不同。由于每一分区的大小是固定的，就对可容纳程序的大小有所限制。因此，程序运行时必须提供对内存资源的最大申请量。

**可变分区**是指系统不预先别分圆足分区而是在装人程序时划分内存分区，使为程岸分在的分区的大小正好等于该设产的前茶进，且分区的个数是可变的，是价，
分区有较大的灵活性，较之固定分区能获得较好的内存利用率。
系统初启后，在内存中除操作系统区之外，其余空间为一个完整的大空闲区。当有程序要求装入内存运行时，系统从该空闲区中划分出一块与程序大小相同的区域进行分配。当系统运行一段时间后，随着一系列的内存分配和回收。原来的一整块大空闲区形成了若干占用区和空闲区相间的布局。若有上下相邻的两块空闲区，系统应将它们合并成为一块连续的大空闲区。

**紧缩技术：**
解决碎片问题的办法是在适当时刻进行碎片整理，通过移动内存中的程序，把所有空闲碎片合并成一个连续的大空闲区且放在内存的一端，而把所有程序占用区放在内存的另一端。这一技术称为“紧缩技术”或“压缩技术”。

**内存分配表**  由两张表格组成。一个是已分配区表，记录已装入的程序在内存中占用分区的起始地址和长度，用标志位指出占用分区的程序名。另一个是空闲区表，记录内存中可供分配的空闲区的起始地址和长度，用标志位指出该分区是未分配的空闲区。

**操作系统查找和分配空闲区的三种分配算法：**  
（1）最先适应算法，又称顺序分配算法，当接到内存申请时，顺序查找分区说明表，找到第一个满足申请长度的空闲区，将其分割并分配。此算法简单，可以快速做出分配决定。  
（2）最优适应算法，当接到内存申请时，查找分区说明表，找到第一个能满足申请长度的最小空闲区，将其分割并分配。此算法最节约空间，因为它尽量不分割大的空闲区；其
缺点是可能会形成很多很小的空闲区域，称作碎片。  
（3）最坏适应算法，当接到内存申请时，查找分区说明表，找到能满足申请要求的最大的空闲区。该算法的基本思想是：在大空闲区中装入信息后，分割剩下的空闲区相对也很大，还能用于装人其他程序。

**分区管理方案的优缺点：**  
分区管理是实现多道程序设计的一种简单易行的存储管理技术。通过分区管理，内存真正成为了共享资源，有效地利用了处理器和I／O设备，从而提高了系统的吞吐量和缩短了周转时间。分区存储管理算法比较简单，所采用的表格不多，实现起来比较容易，内存额外开销较少，存储保护措施也很简单。
在内存利用率方面，可变分区的内存利用率比固定分区高。

**分区管理的主要缺点是:**内存使用仍不充分，并且存在着较为严重的碎片问题。虽然可以解决碎片问题，但需要移动大量信息，浪费了处理器时间。此外，分区管理不能为用户提供“虚存”，即不能实现对内存的“扩充”，每一个用户程序的存储要求仍然受到物理存储器实际存储容量的限制。分区管理要求运行程序一次全部装入内存之后，才能开始运行。这样，内存中可能包含有一些实际不使用的信息。

## 覆盖与交换技术
**覆盖技术**是指一个程序的若干程序段，或几个程序的某些部分共享某一个存储空间。覆盖技术的实现是把程序划分为若干个功能上相对独立的程序段，按照其自身的逻辑结构使那些不会同时执行的程序段共享同一块内存区域。未执行的程序段先保存在磁盘上，当有关程序段的前一部分执行结束后，把后续程序段调入内存，覆盖前面的程序段。

**交换技术**又称对换技术。在分时系统中，用户的进程比内存能容纳的数量要多，这就需要在磁盘上保存那些内存放不下的进程。在需要运行这些进程时，再将它们装人内存。
在实际操作系统中使用交换技术需考虑的问题：换出进程的选择、交换时机的确定、交换空间的分配、换入进程换回内存时位置的确定。

## 虚拟页式存储管理方案
**虚拟存储技术的基本思想**是利用大容量的外存来扩充内存，产生一个比有限的实际内存空间大得多的、逻辑的虚拟内存空间，简称虚存，以便能够有效地支持多道程序系统的实现和大型程序运行的需要，从而增强系统的处理能力。

**页式存储管理思想**首先由英国曼初斯特大学提出，并在该校的Atlas 计算机上使用。该技术近年来已广泛用于计算机系统中，支持页式存储管理的硬件部件通常称为“存储管理部件”。页表指出该程序虚拟地址中的页号与所占用的物理页面号之间的对应关系。页表的长度由程序拥有的页面数而定，故每个程序的页表长度可能是不同的。
页表又是硬件进行地址转换的依据，每执行一条指令时按虚拟地址中的页号查页表。若页表中无此页号，则产生一个“地址错”的程序性中断事件。若页表中有此页号，则可得到对应的物理页面号，按计算公式可转换成访问的内存的物理地址。

**页表的分类：**  
（1）多级页表：大多数操作系统中采用二级页表，即由页表页和页目录一起构成进程页表。第一级表示页目录，保存页表页的地址；第二级表示页表页，保存物理页面号。  
（2）散列页表：当地址空间大于32位时，一种常见的方法是使用以页号为散列值的散列页表。其中每个表项都包含一个链表，该链表中元素的散列值都指向同一个位置。这
样，散列页表中的每个表项都包含三个字段：（a）虚拟页号；（b）所映射的页框号；（c）指向链表中下一个元素的指针。  
（3）反置页表：在反置页表中，每个物理页框对应一个表项。每个表项包含与该页框相对应的虚拟页面地址，以及拥有该页面进程的信息。因此，整个系统中只存在一个页
表，并且每个页框对应其中一个表项。由于一方面系统中只有一个页表，而另一方面系统中又存在着多个映射着物理内存的地址空间，因此需要在反置页表中存放地址空间标志符。  

**转换检测缓冲区**（TLB）：利用高速缓冲存储器存储当前访问最频繁的少数活动页面的页号，这个高速缓冲存储器称为“转换检测缓冲区”，也称为“快表”。

**缺页异常处理过程：**  
（1）根据当前执行指令中的逻辑地址查页表的有效位，判断该页是否在内存。  
（2）该页标志为“0”，形成缺页异常。保留现场，中断装置通过交换PSW让操作系统的中断处理程序占用处理器。  
（3）操作系统处理缺页异常，寻找一个空闲的页面。  
（4）若有空闲页，则把磁盘上读出的信息装入该页面中。  
（5）修改页表及内存分配表，表示该页已在内存。  
（6）如果内存中无空闲页，则按某种算法选择一个已在内存的页面，把它暂时调出内存。若在执行中该页面已被修改过，则要把该页信息重新写回到磁盘上，否则不必重新写回磁盘。
当一页被暂时调出内存后，让出的内存空间用来存储当前需要使用的页面。页面被调出或装入之后都要对页表及内存分配表作修改。  
（7）恢复现场，重新执行被中断的指令。当重新执行该指令时，由于要访问的页面已被装入内存，所以可正常执行下去。  

**页面调度策略：**  
虚拟存储器系统通常定义三种策略来规定如何（或何时）进行页面调度：调人策略（请求调页和预调页）、置页策略和置换策略（固定分配局部换、可变分配全局置换和可变分配局部置换）。

**页面置换算法：**  
（1）理想页面置换算法（OPT）。  
（2）先进先出页面置换算法（FIFO）。  
（3）第二次机会页面置换算法。  
（4）时钟页面置换算法（Clock）。  
（5）最近最少使用页面置换算法（LRU）。

**影响缺页率的因素：**
（1）分配给程序的物理页面数。
（2）页面的大小。
（3）程序编制方法。
（4）页面调度算法。

**虚拟页式存储管理的优缺点：**
虚拟页式存储管理的主要优点是，由于它不要求进程的程序段和数据在内存中连续存放，从而有效地解决了碎片问题。这既提高了内存的利用率，又有利于组织多道程序执行。
虚拟页式存储管理的主要缺点是，存在页面空间的浪费问题。这是由于各种程序代码的长度是各不相同的，但页面的大小是固定的，
所以在每个程序的最后一页内总有一部分空间得不到利用。如果页面较大，则由此引起的存储空间的损失仍然较大。
